package fabrica2.persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import fabrica2.excecoes.DAOException;
import fabrica2.modelo.Funcionario;

public class FuncionarioDAO extends GenericDAOImpl<Funcionario> implements
		Dao<Funcionario> {

	@Override
	public Funcionario persistir(Funcionario funcionario) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Funcionario where id_funcionario = "
				+ funcionario.getIdFuncionario());
		try {
			// Se existir atualiza
			if (rs.next()) {
				PreparedStatement ps = getConexao()
				.prepareStatement(
						"UPDATE Funcionario" +
						" SET nome = ?, email = ?, endereco = ?, telefone = ?, funcao = ?, idiomas = ?, sexo = ?, banco = ?, agencia = ?, tipo_conta = ?, numero_conta = ?, favorecido = ?  " +
						"WHERE id_funcionario = "+funcionario.getIdFuncionario());
				ps.setString(1, funcionario.getNome());
				ps.setString(2, funcionario.getEmail());
				ps.setString(3, funcionario.getEndereco());
				ps.setString(4, funcionario.getTelefone());
				ps.setString(5, funcionario.getFuncao());
				ps.setString(6, funcionario.getIdiomas());
				ps.setString(7, funcionario.getSexo());
				ps.setString(8, funcionario.getBanco());
				ps.setString(9, funcionario.getAgencia());
				ps.setString(10, funcionario.getTipoConta());
				ps.setString(11, funcionario.getNumeroConta());
				ps.setString(12, funcionario.getFavorecido());
				ps.executeUpdate();
			}
			// Ou cria um novo
			else {
				PreparedStatement ps = getConexao()
				.prepareStatement(
						"INSERT INTO Funcionario" +
						" (nome, email, endereco, telefone, funcao, idiomas, sexo, banco, agencia, tipo_conta, numero_conta, favorecido) VALUES  " +
						"(?,?,?,?,?,?,?,?,?,?,?,?)");
				ps.setString(1, funcionario.getNome());
				ps.setString(2, funcionario.getEmail());
				ps.setString(3, funcionario.getEndereco());
				ps.setString(4, funcionario.getTelefone());
				ps.setString(5, funcionario.getFuncao());
				ps.setString(6, funcionario.getIdiomas());
				ps.setString(7, funcionario.getSexo());
				ps.setString(8, funcionario.getBanco());
				ps.setString(9, funcionario.getAgencia());
				ps.setString(10, funcionario.getTipoConta());
				ps.setString(11, funcionario.getNumeroConta());
				ps.setString(12, funcionario.getFavorecido());
				ps.execute();
				String update = "SELECT * FROM Funcionario WHERE nome = '"
						+ funcionario.getNome() + "' AND " + "endereco = '"
						+ funcionario.getEndereco() + "' AND " + "telefone = '"
						+ funcionario.getTelefone() + "' AND " + "email = '"
						+ funcionario.getEmail() + "' AND " + "banco = '"
						+ funcionario.getBanco() + "' AND " + "agencia = '"
						+ funcionario.getAgencia() + "' AND "
						+ "numero_conta = '" + funcionario.getNumeroConta()
						+ "' AND " + "tipo_conta = '"
						+ funcionario.getTipoConta() + "' AND " + "idiomas = '"
						+ funcionario.getIdiomas() + "' AND "
						+ "favorecido = '" + funcionario.getFavorecido()
						+ "' AND " + "sexo = '" + funcionario.getSexo() + "' ";
				rs = getResultSet(update);
				if (rs.next()) {
					funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
					System.out.println(funcionario.getIdFuncionario());
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException();
		} finally {
			desconectar();
		}
		return funcionario;
	}

	@Override
	public void remover(Funcionario funcionario) throws DAOException {
		EquipeDAO ed = new EquipeDAO();
		ed.remover(funcionario);
		execute("DELETE FROM Funcionario WHERE id_funcionario = "
				+ funcionario.getIdFuncionario());

	}

	@Override
	public Funcionario getPorId(int id) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Funcionario WHERE id_funcionario = "
				+ id);
		Funcionario funcionario = new Funcionario();
		try {
			if (rs.next()) {
				funcionario.setNome(rs.getString("nome"));
				funcionario.setEndereco(rs.getString("endereco"));
				funcionario.setTelefone(rs.getString("telefone"));
				funcionario.setEmail(rs.getString("email"));
				funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
				funcionario.setAgencia(rs.getString("agencia"));
				funcionario.setBanco(rs.getString("banco"));
				funcionario.setFavorecido(rs.getString("favorecido"));
				funcionario.setFuncao(rs.getString("funcao"));
				funcionario.setIdiomas(rs.getString("idiomas"));
				funcionario.setNumeroConta(rs.getString("numero_conta"));
				funcionario.setTipoConta(rs.getString("tipo_conta"));
				funcionario.setSexo(rs.getString("sexo"));
			}
		} catch (SQLException se) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return funcionario;
	}

	@Override
	public List<Funcionario> listar() throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Funcionario");
		List<Funcionario> funcionarios = new ArrayList<Funcionario>();
		Funcionario funcionario;
		try {
			while (rs.next()) {
				funcionario = new Funcionario();
				funcionario.setNome(rs.getString("nome"));
				funcionario.setEndereco(rs.getString("endereco"));
				funcionario.setTelefone(rs.getString("telefone"));
				funcionario.setEmail(rs.getString("email"));
				funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
				funcionario.setAgencia(rs.getString("agencia"));
				funcionario.setBanco(rs.getString("banco"));
				funcionario.setFavorecido(rs.getString("favorecido"));
				funcionario.setFuncao(rs.getString("funcao"));
				funcionario.setIdiomas(rs.getString("idiomas"));
				funcionario.setNumeroConta(rs.getString("numero_conta"));
				funcionario.setTipoConta(rs.getString("tipo_conta"));
				funcionario.setSexo(rs.getString("sexo"));
				funcionarios.add(funcionario);
			}
		} catch (SQLException se) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return funcionarios;
	}

	@Override
	public void removerPorId(int id) throws DAOException {
		execute("DELETE FROM Funcionario WHERE id_funcionario = " + id);
	}

	public List<Funcionario> getFuncionarioPorNome(String nome)
			throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Funcionario WHERE nome LIKE '%"
				+ nome + "%'");
		List<Funcionario> funcionarios = new ArrayList<Funcionario>();
		Funcionario funcionario;
		try {
			while (rs.next()) {
				funcionario = new Funcionario();
				funcionario.setNome(rs.getString("nome"));
				funcionario.setEndereco(rs.getString("endereco"));
				funcionario.setTelefone(rs.getString("telefone"));
				funcionario.setEmail(rs.getString("email"));
				funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
				funcionario.setAgencia(rs.getString("agencia"));
				funcionario.setBanco(rs.getString("banco"));
				funcionario.setFavorecido(rs.getString("favorecido"));
				funcionario.setFuncao(rs.getString("funcao"));
				funcionario.setIdiomas(rs.getString("idiomas"));
				funcionario.setNumeroConta(rs.getString("numero_conta"));
				funcionario.setTipoConta(rs.getString("tipo_conta"));
				funcionario.setSexo(rs.getString("sexo"));
				funcionarios.add(funcionario);

			}
		} catch (SQLException se) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return funcionarios;
	}

	public List<Funcionario> getEquipe(int idAcao) throws DAOException {
		ResultSet rs = getResultSet("EXEC sp_getEquipe " + idAcao);
		List<Funcionario> funcionarios = new ArrayList<Funcionario>();
		Funcionario funcionario;
		try {
			while (rs.next()) {
				funcionario = new Funcionario();
				funcionario.setNome(rs.getString("nome"));
				funcionario.setEndereco(rs.getString("endereco"));
				funcionario.setTelefone(rs.getString("telefone"));
				funcionario.setEmail(rs.getString("email"));
				funcionario.setIdFuncionario(rs.getInt("id_funcionario"));
				funcionario.setAgencia(rs.getString("agencia"));
				funcionario.setBanco(rs.getString("banco"));
				funcionario.setFavorecido(rs.getString("favorecido"));
				funcionario.setFuncao(rs.getString("funcao"));
				funcionario.setIdiomas(rs.getString("idiomas"));
				funcionario.setNumeroConta(rs.getString("numero_conta"));
				funcionario.setTipoConta(rs.getString("tipo_conta"));
				funcionario.setSexo(rs.getString("sexo"));
				funcionarios.add(funcionario);
			}
		} catch (SQLException se) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return funcionarios;
	}

}
